Micron Document
____ _ _ _ _
| _ \ ___ | |_ (_) _ __ ___ __| | (_) __ _
| |_) | / _ \ | __| | | | '_ \ / _ \ / _| | | | / _ |
| _ < | __/ | |_ | | | |_) | | __/ | (_| | | | | (_| |
|_| \_\ \___| \__| |_| | .__/ \___| \__,_| |_| \__,_|
|_|


The NomadNet German Wikipedia | Archives | Info
- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b- `b

🔍 Search

ÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻÂŻ

Byte-Reihenfolge
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
top
Die Byte-Reihenfolge (englisch byte order oder endianness) bezeichnet in der Informatik die Speicherorganisation fĂźr einfache Zahlenwerte, in erster Linie die Ablage ganzzahliger Werte (Integer) im Arbeitsspeicher.

Die ersten Rechnerarchitekturen haben die Darstellung mehrstelliger Zahlen aus dem Alltag entsprechend der Konvention des Stellenwertsystems ßbernommen, zunächst fßr dezimal, dann auch fßr binär dargestellte Zahlen. In dieser Konvention beginnt die Notation einer Zahl mit der Ziffer an der hÜchstwertigen Stelle. Addition, Subtraktion und Multiplikation beginnen aber mit der niedrigstwertigen Ziffer, der Einerstelle.

Solange man innerhalb ähnlicher Rechnerarchitekturen blieb, musste man sich nicht um die Endianness kümmern, sie entsprach ja der gewohnten. Da die genannten drei mathematischen Grundfunktionen jedoch einen Maschinenzyklus früher starten können, wenn man die Bitreihenfolge umkehrt, haben in der Folge einige Hersteller ein entsprechendes Architekturprinzip erstellt. Das heißt: die Einerstelle wird an die Anfangsadresse gelegt, und die 3 genannten Algorithmen schreiten nach rechts in die höheren Stellen und Adressen fort. Diese Abweichung vom Gewohnten machte die Begriffsbildung Endianness erforderlich:

• anfanghoch Beim big-endian (wörtlich etwa: „großendigen“, siehe auch Abschnitt „Etymologie“) Format wird das höchstwertige Byte zuerst gespeichert, d. h. an der kleinsten Speicheradresse. Allgemein bedeutet der Begriff, dass bei zusammengesetzten Daten die höchstwertige (höchstrangige) Komponente zuerst genannt wird, wie etwa bei der deutschen Schreibweise der Uhrzeit: Stunde:Minute:Sekunde.
• anfangniedrig Beim little-endian (wörtlich etwa: „kleinendigen“) Format wird dagegen das niedrigstwertige Byte an der Anfangsadresse gespeichert, also die niedrigstwertige Komponente zuerst genannt, wie bei der herkömmlichen deutschen Datumsschreibweise: Tag.Monat.Jahr.

Im Sprachgebrauch werden die beiden Varianten in der Computertechnik oft auch nach den Herstellern von Mikroprozessoren benannt, die die jeweilige Variante in mehreren Prozessorfamilien verwenden bzw. verwendet haben: „Motorola-Format“ steht für big-endian, „Intel-Format“ für little-endian.

Werden Daten bitweise seriell ßbertragen, so ist zusätzlich die Bit-Reihenfolge festzulegen. Auch hier sind unterschiedliche Varianten anzutreffen:

• Most-Signifikant-Bit-First (MSb), wenn das höchstwertige Bit eines Bytes zuerst übertragen wird, verwendet etwa I²C.
• Least-Signifikant-Bit-First (LSb), in der das niedrigstwertige Bit eines Bytes zuerst übertragen wird, ist zum Beispiel für RS-232cite-ref-mil-std-188-100-1-0[1] und Ethernet-Frames festgelegt.

Contents

• Big-endian
• Dateiformate
• Etymologie
• Weblinks

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Vereinbarungen

Folgende Aussagen, Ăźber die in der Literatur hochgradiger Konsens besteht, seien als Ausgangsbasis fĂźr die Diskussion und Definition der Sachverhalte explizit gemacht:

• Der Arbeitsspeicher kennt eine kleinste adressierbare Einheit, auch „Speicherstelle“ genannt. In diesem Artikel sei sie exemplarisch das Byte. Es besteht aus 8 Bits und sein Inhalt wird in diesem Artikel vorwiegend mit zwei hexadezimalen Ziffern angegeben, wobei jede Ziffer für 4 Bits entsprechend einem Halbbyte (Nibble) steht. Die kleinste adressierbare Einheit könnte aber auch aus einer anderen Anzahl von Bits bestehen, oder, wenn die Maschine im Dezimalsystem rechnet, eine Dezimalziffer beherbergen.
• Die (Byte-)Adressen des Arbeitsspeichers sind nicht-negative ganze Zahlen.
• Ein (einfaches) Datenfeld wird im Arbeitsspeicher in einem zusammenhängenden Speicherbereich (einer lückenlosen Folge von Adressen) abgelegt, der eine Anfangs-(Byte-)adresse und eine (Byte-)Länge hat.
• Die Maschinenbefehle adressieren ein Datenfeld über seine Anfangsadresse.cite-ref-2[2] Ganz analog spielt in Assemblersprachen und in höheren Programmiersprachen die Anfangsadresse die Rolle eines Zeigers zum Datenfeld.
• Das Byte an der Anfangsadresse wird häufig als das linke, das an der Endadresse als das rechte Byte bezeichnet (siehe Bit-Reihenfolge). An diese Orientierung halten sich horizontale graphische Darstellungen von Datenfeldern sehr häufig, aber nicht immer.
• Ein Byte innerhalb eines einfachen Datenfelds hat zu dessen Anfangsadresse einen (nicht-negativen) Abstand, der als Offset bezeichnet wird.
• Betrachtet werden numerische Daten, die im Speicher entsprechend einem Stellenwertsystem dargestellt sind. Bei einem solchen System kommt einer Ziffer neben ihrem Wert als einzelnem Zeichen noch ein (von ihrer Position innerhalb der ganzen Zahl abhängiger) Stellenwert zu, auch „Wertigkeit“ oder „Signifikanz“ genannt.
• Die in Handbüchern und unten vorkommenden hexadezimalen Notationen 3A4B5C6Dh oder 0x3A4B5C6D bezeichnen einen Zahlwert, und zwar die Zahl 978.017.389, und nicht ihre Darstellung im Speicher, es sei denn, man meint die Speicherung 3Ah4Bh5Ch6Dh. Will man eine andere Art der Speicherung derselben Zahl 0x3A4B5C6D angeben, so muss man auf andere Notationen ausweichen, wie auf 6Dh5Ch4Bh3Ah oder 0x6D,0x5C,0x4B,0x3A.
• Generell multipliziert ein Links-Shift eine Binärzahl mit einer Zweierpotenz, verschiebt also die Bits in Richtung „Big-End“ (= Richtung most significant bit), und ein Rechts-Shift dividiert durch eine solche, verschiebt die Bits in Richtung „Little-End“ (= Richtung least significant bit). Die Shift-Operationen induzieren eine eindeutige konsistente »Adressierung« von den Bytes auf die Bits (s. dazu den Abschnitt Adressierung von Bits).cite-ref-3[3] (Die links-rechts-Orientierung bei Shift-Instruktionen ist etwas Anderes und völlig unabhängig von derjenigen bei der Adressierung mit links = niedrige und rechts = hohe Adresse.)

Steigt bei einer im Speicher abgelegten Zahl die Wertigkeit einer Stelle mit der wachsenden Adresse, dann ist sie im Little-Endian-Format dargestellt.

Fällt bei einer im Speicher abgelegten Zahl die Wertigkeit einer Stelle mit der wachsenden Adresse, dann ist sie im Big-Endian-Format dargestellt.

Wird bei einem Computersystem eines dieser beiden Formate fĂźr die Speicherung numerischercite-ref-4[4] Felder durchgehalten, so wird das erste als Little-Endian-, das zweite als Big-Endian-System bezeichnet.

Beispiel: Speicherung einer 32-Bit-Ganzzahl in 4 Bytes

| Byte- Adresse | Big Endian | Mixed Endian | Little Endian |
|---|---|---|---|
| 10000 | 0A | 0B | 0D |
| 10001 | 0B | 0A | 0C |
| 10002 | 0C | 0D | 0B |
| 10003 | 0D | 0C | 0A |

Das Beispiel in der Grafik stellt die Ganzzahl 168.496.141 als 32-Bit-Integer-Wert dar (hexadezimal: 0A0B0C0Dh), gespeichert in 4 Bytes ab einer angenommenen Speicheradresse von 10000:

• Big-endian speichert 168496141 = 0A0B0C0Dh in der Reihenfolge 0Ah0Bh0Ch0Dh.
• Little-endian speichert168496141 = 0A0B0C0Dh in der umgekehrten Reihenfolge der Bytes 0Dh0Ch0Bh0Ah.

Einige ältere Systeme (z. B. PDP-11) speichern die Bytes auch in der Reihenfolge 0Bh0Ah0Dh0Ch (aber nicht als 0Ch0Dh0Ah0Bh). Dies wird als mixed-endian oder auch middle-endian bezeichnet.

Einige Systeme speichern sowohl big-endian als auch little-endian, was als bi-endian bezeichnet wird.

Reihenfolge der Ziffern innerhalb von Zahlen in der Sprache

Auch die gewöhnliche Darstellung von (Dezimal-)Zahlen ist – im Sinne der Leserichtung der meisten europäischen Sprachen von links nach rechts – big-endian. Dies kommt dadurch zustande, dass die Ziffernreihenfolge der indisch-arabischen Zahlen bei den Schriften Mitteleuropas beibehalten wurde. Im Arabischen, das sich von rechts nach links liest, werden die Zahlen gleich geschrieben, d. h. für Zahlen unter 100 werden sie als „little-endian“ gelesen (für Zahlen ab 100 werden sie „big-endian“ gelesen). Auch im Deutschen werden die Zahlen von 13 bis 99 little-endian ausgesprochen: „Ein-und-Zwanzig“; die Eins als weniger wertige Stelle wird zuerst gesprochen (diese Reihenfolge gibt es auch in anderen Sprachen).

Ein Beispiel für Dezimalzahlen: In der gebräuchlichsten Darstellung (big-endian) wird die Dezimalzahl Eintausend-zweihundert-dreißig dargestellt als „1230“, wobei die „1“ die Wertigkeit 1000 hat, die „2“ die Wertigkeit 100 und die „3“ die Wertigkeit 10. In der „Little-Endian“-Darstellung ist es umgekehrt, so dass die Darstellung der Zahl „0321“ wäre (ausgesprochen vielleicht „Dreißig-Zweihundert-Eintausend“).

Kontexte des Byte-Reihenfolge-Problems

Das Problem der Byte-Reihenfolge betrifft solche Datentypen, die aus mehreren Byte zusammengesetzt sind und vom jeweiligen Prozessor direkt unterstßtzt werden, also hauptsächlich Ganzzahl- und Gleitkommatypen, sowie Datentypen, die vom Prozessor effektiv als solche interne Datentypen behandelt werden, z. B. UTF-16.

Um dieses Problem bei Unicode-Zeichen zu umgehen, wird oft eine Bytereihenfolge-Markierung (BOM) benutzt. Die Zeichenfolge "Die" (drei Zeichen, 6 Byte) mit BOM (ein Zeichen, 2 Byte) als UTF-16-Kodierung, in der Byte-Darstellung von Hex-Editoren (8 Byte) stellt sich fĂźr die beiden unterschiedliche Byte-Reihenfolgen etwa so dar:

Big Endian:

FE FF 00 44 00 69 00 65 | Þÿ␣D␣i␣e

Little Endian:

FF FE 44 00 69 00 65 00 | ÿÞD␣i␣e␣

PlattformĂźbergreifende Darstellung von Zahlen

Um einen fehlerfreien Datenaustausch zwischen Computern verschiedener Plattformen zu ermöglichen, ist bei Netzwerkprotokollen immer die Byte-Reihenfolge festgeschrieben. Diese wird als „Network Byte Order“ bezeichnet. Die natürliche Byte-Reihenfolge des Systems wird demgegenüber als „Host Byte Order“ bezeichnet. Arbeitet das System nicht mit dieser Byte-Reihenfolge, so muss diese im Netzwerktreiber beziehungsweise zum Teil im Anwendungsprogramm entsprechend umgewandelt werden.

Im Falle des heute vornehmlich verbreiteten Internetprotokoll-Satzes entspricht die Network Byte Order dem Big-Endian-Format. Es existieren jedoch noch immer Protokolle, die eine andere Byte-Reihenfolge verwenden. DarĂźber hinaus gibt es Datentypen, die nicht oder nicht nur durch die Endianness charakterisiert sind, wie z. B. Gleitkommazahlen, bei deren Umwandlung auch Genauigkeitsverluste mĂśglich sind.

In der auf den meisten Betriebssystemen angebotenen BSD-IP-Socket-API existieren zur Umwandlung der Byte-Reihenfolge sechs Funktionen:

| Datentyp (Wortbreite) | Umwandlung | Umwandlung |
|---|---|---|
| Datentyp (Wortbreite) | Host-to-network | Network-to-host |
| double (64 bit) | htond() | ntohd() |
| long (32 bit) | htonl() | ntohl() |
| short (16 bit) | htons() | ntohs() |

Die korrekte Umwandlung ist garantiert fĂźr vorzeichenlose Ganzzahlen. Negative Ganzzahlen werden korrekt umgewandelt, wenn sie im Zweierkomplement dargestellt sind und die Bitbreite Ăźbereinstimmt.

Auf Big-Endian-Maschinen sind diese Funktionen trivial, da Host- und Network-Byteorder identisch sind.

Fßr Programmierer von Netzwerkanwendungen empfiehlt sich die Verwendung dieser Funktionen, da sich der Quellcode dadurch auch auf andere Systeme ßbertragen lässt.

Die Auswahl der zur laufenden Hardware passenden Implementierung geschieht normalerweise implizit durch das Betriebssystem – im Notfall auch durch den Benutzer beim Download.

Der Endianness-Typ einer Maschine lässt sich programmtechnisch wie folgt feststellen:

union {
uint16_t sixteenBits;
uint8_t twoBytes[2];
} test_endianness;
test_endianness.sixteenBits = 1 << 15; // 0x8000, 32768
if (test_endianness.twoBytes[0] != 0) {
// Das Programm läuft auf einer Big-Endian-Maschine.
}
else {
// Das Programm läuft auf einer Little-Endian-Maschine.
}

In der BitConverter-Klasse des .NET Framework gibt es das Feld IsLittleEndian,cite-ref-5[5] das den Endianness-Typ (der laufenden Hardware) abzufragen gestattet.cite-ref-6[6]

Byte-Order-Probleme kÜnnen auch beim Austausch von Dateien sowie zum Teil beim Austausch von Datenträgern zwischen verschiedenen Plattformen auftreten. Hier muss entweder durch eindeutige Definition des entsprechenden Dateiformats beziehungsweise Dateisystems oder durch einen Kompatibilitätsmodus, der während des Ladens eine Erkennung und eventuelle Umwandlung durchfßhrt, Abhilfe geschaffen werden.

Die Problematik der Darstellung von Daten auf unterschiedlichen Systemen und ihres Austauschs wird ganz allgemein adressiert von der Darstellungsschicht des OSI-Modells.

e2-80-9enuxi-e2-80-9cnuxi„Nuxi“

Scherzhaft wird das Problem verschiedener Endianness unterschiedlicher Architekturen auch oft als NUXI-Problem bezeichnet: Wenn das Wort UNIX in zwei Zwei-Byte-Words (zwei 16-Bit-Register für „UN“ und „IX“) gespeichert wird, liegt es in einem Big-Endian-System als „UNIX“ im Speicher, in einem Little-Endian-System dagegen wegen der Vertauschung der Bytes in jedem Wort als „NUXI“ (auf 32-Bit-Systemen stünde dagegen „XINU“ in einem einzelnen 32-Bit-Register).

Wichtige Eigenschaften

Bei den ersten Mikroprozessoren waren dies nur 4 Bit (später dann lange Zeit 8 Bit). Der Adressbus ist aber bei diesen CPUs wesentlich breiter. Damit ergab sich die Notwendigkeit, Daten mit einem Befehl zu laden oder zu speichern, welche auf mindestens zwei gekoppelte Register verteilt waren. Um die Komplexität der CPU zu verringern (jede einzelne Transistorfunktion war noch teuer) war es einfacher, bei jeder Operation automatisch das niederwertige „Datenhäppchen“ zu laden, während dieser Speicheroperation konnte dann der Befehl weiter dekodiert und gegebenenfalls die weiteren Daten im nächsten Zyklus bearbeitet werden. Bei Großrechnern („main frames“) bestand dieses Problem weniger, da sie damals schon mit Datenbus-Breiten von 16 bis 48 Bit arbeiteten, diese also in einem einzigen Speicherzyklus laden konnten und somit die (Byte)-Reihenfolge keine Rolle spielte.

Big-Endian-Format

1. Da die Maschineninstruktionen die Operanden bei ihrer kleinsten Adresse ansprechen, muss bei Operationen, deren Algorithmus an der niedrigstwertigen Stelle beginnt, auf diese durch eine Erhöhung der Anfangsadresse um die Operandenlänge–1 positioniert werden. Somit ist Addieren, Subtrahieren und Multiplizieren geringfügig aufwändiger.
2. Dividieren und Vergleichen beginnen dagegen beim hĂśchstwertigen Byte, sind deshalb marginal einfacher.
3. Dieselben Vergleichsoperationen kĂśnnen zum Vergleichen von (vorzeichenlosen) Big-Endian-Zahlen wie von kurzen Texten (2, 4 oder 8 Byte lang) genommen werden, da beide lexikographisch sortiert werden.
4. Zum Vergleichen von Zeichenketten gibt es beim Großrechnersystem IBM/370 den Maschinenbefehl CLCL (Compare Logical Character Long) mit zwei (verschieden und beliebig) langen Speicheroperanden, der die lexikographische Ordnung implementiert.cite-ref-7[7]
5. Im Big-Endian-Format sind Hexdumps von Zahlen leichter lesbar, da die Reihenfolge der Ziffern die gleiche ist wie in der Ăźblichen Schreibweise des Stellenwertsystems.

Little-Endian-Format

1. Da die Maschineninstruktionen die Operanden bei ihrer kleinsten Adresse ansprechen, entfällt bei Operationen, deren Algorithmus an der niedrigstwertigen Stelle beginnt, so bei Addition, Subtraktion und Multiplikation, das initiale Inkrementieren mit der Operandenlänge. Diese Operationen sind somit geringfßgig einfacher in der Hardware zu implementieren.
2. Um auf einer Little-Endian-Maschine eine Zwei-Byte-Zahl in eine Vier-Byte-Zahl zu verwandeln, mßssen lediglich zwei mit Null gefßllte Bytes am Ende angefßgt werden, ohne dass sich die Speicheradresse ändert. Auf einer Big-Endian-Maschine muss der Wert zuvor im Speicher um zwei Bytes verschoben werden. Auch die umgekehrte Umwandlung gestaltet sich einfacher. Auf einer Little-Endian-Maschine werden einfach die hÜherwertigen Byte verworfen, ohne dass sich die Speicheradresse ändert.
3. Dagegen ist die Implementierung von Operationen wie der Division, deren Algorithmus an der hÜchstwertigen Stelle beginnt, marginal aufwändiger.
4. Maschinenbefehle fĂźr das lexikographische Vergleichen von langen Texten fehlen bei manchen Maschinen und mĂźssen durch Unterprogramme, wie memcmp()cite-ref-8[8], ersetzt werden.

Beispiel fĂźr eine dezimale Little-Endian-Addition:

717
+ 0452
----
7523
====

(Probe: 717+2540=3257)

Beispiel: Interpretation eines Hexdumps

Der Zweck eines Dumps ist die eindeutige Darstellung des Speicherinhalts bspw. zur Fehleranalyse. Bei Maschinen, deren Speicherstelle (Byte) aus 8 Bits besteht, wird hierfßr die Darstellung im Hexadezimalsystem gewählt, bei dem die 28 = 256 = 162 verschiedenen Inhalte eines Bytes in 2 Hexadezimalziffern ausgedrßckt werden. Dieser Codierung, die sowohl Binärwerte wie Maschineninstruktionen wie Dezimalwerte im BCD-Code unmittelbar abdeckt, wird ßblicherweise eine Spalte beigegeben, die jedes einzelne Byte sofern mÜglich als alphabetisches Zeichen darstellt, so dass eventuell im Speicher vorhandene Texte leichter erkannt und lesbar werden.

Das folgende Beispiel zeigt, wie zwei aufeinander folgende Bytes (4 Halbbytes) in einem Hexdump mit dem lesbaren hexadezimalen Inhalt a732 zu interpretieren sind.

| | Hexdump | Hexdump | Hexdump | 2 vorzeichenlose 8-Bit-Binärzahlen | 2 vorzeichenlose 8-Bit-Binärzahlen | 2 vorzeichenlose 8-Bit-Binärzahlen | 2 vorzeichenlose 8-Bit-Binärzahlen | 2 vorzeichenlose 8-Bit-Binärzahlen | 2 vorzeichenlose 8-Bit-Binärzahlen | 1 vorzeichenlose 16-Bit-Binärzahl | 1 vorzeichenlose 16-Bit-Binärzahl | 1 vorzeichenlose 16-Bit-Binärzahl |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| | Bytes | Bytes | Text | Byte0: Bits | hex | dez | Byte1: Bits | hex | dez | Bits | hex | dez |
| Offset | 0 | 1 | | 0123 4567 | | | 0123 4567 | | | 0123 4567 89ab cdef | | |
| lesbar | a7 | 32 | §2 | | | | | | | | | |
| | | | | big-endian | big-endian | big-endian | big-endian | big-endian | big-endian | big-endian | big-endian | big-endian |
| interne Bitfolge | interne Bitfolge | interne Bitfolge | interne Bitfolge | 1010 0111 | | | 0011 0010 | | | 1010 0111 0011 0010 | | |
| Interpretation | Interpretation | Interpretation | Interpretation | 1010 0111 2 | a7 h | 167 10 | 0011 0010 2 | 32 h | 50 10 | 1010 0111 0011 0010 2 | a7 32 h | 42802 10 |
| | | | | little-endian | little-endian | little-endian | little-endian | little-endian | little-endian | little-endian | little-endian | little-endian |
| interne Bitfolge | interne Bitfolge | interne Bitfolge | interne Bitfolge | 1110 0101 | | | 0100 1100 | | | 1110 0101 0100 1100 | | |
| Interpretation | Interpretation | Interpretation | Interpretation | 1010 0111 2 | a7 h | 167 10 | 0011 0010 2 | 32 h | 50 10 | 0011 0010 1010 0111 2 | 32 a7 h | 12967 10 |

Besteht das Feld nur aus einem einzelnen Byte (8-Bit-Binärzahl mit oder ohne Vorzeichen) oder einer Ansammlung davon (bspw. Text im Code ISO 8859) – in der Tabelle die Spalten „2 vorzeichenlose 8-Bit Binärzahlen“ –, dann unterscheidet sich die Interpretation bei den beiden Formaten big- oder little-endian nicht. interne-bitfolgeZwar ist zwischen den beiden Formaten die interne Reihenfolge der Bits pro Byte genauso gespiegelt wie die der Bytes pro Integer (s. Bitwertigkeit#Adressierung von Bits). Durch die Maßgaben der Hexadezimaldarstellung ist der Hexdump aber Byte für Byte vollkommen festgelegt, so dass sich big- oder little-endian nicht unterscheiden.

Besteht das Feld aus mehr als einem Byte, kommt bei little-endian die sogenannte „Intel-Konvention“cite-ref-kueveler-schwoch-2007-9-0[9] zum Zuge. Diese besagt, dass – anders als bei big-endian – das niederwertige Byte auf der niederen Speicheradresse abgelegt wird und die höherwertigen Bytes auf den nachfolgenden Speicheradressen. Im Ergebnis sind bspw. bei ganzzahligen Feldern der Länge 16, 32 oder 64 Bits die beiden Hexdump-Darstellungen byteweise Spiegelungen voneinander. Zur Verdeutlichung ist in der Tabelle bei den Spalten „1 vorzeichenlose 16-Bit Binärzahl“ der Inhalt des ersten der 2 Bytes mit einem Überstrich versehen.

Verwendung und Hardware-Beispiele

Big-endian

Das Format big-endian wurde z. B. eingesetzt bei der Motorola-6800- sowie der Motorola-68000- bzw. -Coldfire-Familie, den Prozessoren der System-z- und Sun-SPARC-CPUs und dem Power (bis Power7) und PowerPC.

Big-endian wird verwendet von Mainframe-Systemen (z. B. IBM-Mainframe) sowie MIPS-, SPARC-, Power-, PowerPC-, Motorola 6800/68k-, Atmel-AVR32-cite-ref-10[10] und TMS9900-Prozessoren. Auch Alpha-Prozessoren lassen sich in diesem Modus betreiben, dies ist jedoch unĂźblich. Mit dem IBM POWER8 wurde die Power-Architektur (PAPR) auf little-endian umgestellt, jedoch kann der POWER8 ebenfalls noch im Big-Endian-Modus betrieben werden.cite-ref-11[11]

PowerPC kann bei einigen Modellen auch auf little-endian umgeschaltet werden sowie POWER8 vom Little- in den Big-Endian-Modus umgestellt werden – IBM forciert jedoch seit dem POWER8 den Little-Endian-Modus.

Little-endian

Das Little-Endian-Format wurde ursprĂźnglich beim Prozessor 6502, der NEC-V800-Reihe, PICmicro oder den Intel-x86-Prozessoren verwendet.

Auch heutige PC-Systeme (x86-kompatible) verwenden little-endian. Weitere sind Alpha, Altera Nios, Atmel AVR, IBM Power ab POWER8, RISC-V, manche SH3/SH4-Systeme oder VAX. Dies sind True-Little-Endian-Systeme. Auch die ARM-Architektur verwendet standardmäßig Little-Endian. Arm-CPUs werden in Mikrokontrollern (beispielsweise RP2040), Single-Board-Computern (Raspberry Pi) und den allermeisten Mobiltelefonen eingesetzt. Die Smartphone-Betriebssysteme Android und IOScite-ref-12[12] verwenden die Arm-Architektur und verwalten den Speicher im Little-Endian-Modus.

Im Gegensatz dazu stehen Architekturen, wie manche PowerPC-Varianten (u. a. 603, 740, 750), die nur als Little-Endian-Systeme konfiguriert werden kĂśnnen (s. u. bi-endian) und aus der Sicht des laufenden Programms dann little-endian verwenden, Werte im Speicher jedoch weiterhin im big-endian-Format ablegen. Bei Lade- und Speicheroperationen wird die Darstellung implizit umgewandelt. Bei der Softwareerstellung fĂźr diese Systeme muss dies gegebenenfalls berĂźcksichtigt werden, z. B. bei der Treiber-Programmierung.

Mischvarianten (bi-endian)

Einige Prozessoren, z. B. bestimmte MIPS-Varianten und POWER/PowerPC (PAPR) sowie alle Alpha-Prozessoren, lassen sich zwischen little-endian und big-endian umschalten.

Auch ARM-Prozessoren (inkl. des Intel XScales) kĂśnnen bei Datenzugriffen sowohl in little- als auch in big-endian betrieben werden; auf Code wird bei ARM-Prozessoren allerdings immer im Little-Endian-Format zugegriffen.

Die von Hewlett-Packard und Intel gemeinsam entwickelte Itanium-Architektur „IA-64“ beherrscht ebenfalls beide Byte-Reihenfolgen, was zur Erleichterung der Portierung von Betriebssystemen hatte dienen sollen (insbesondere zwischen HP-UX (big-endian) und Windows (little-endian)).

Dateiformate

Die typische Verwendung einer Byte-Reihenfolge in einer Prozessorarchitektur zur Ablage von Werten im Arbeitsspeicher hat Einfluss auf die Byte-Reihenfolge von Werten im Sekundärspeicher (oft Festplatten). Bei der Neuerstellung von Dateiformaten wurde die Byte-Reihenfolge der Zahlenwerte so gelegt, dass sie beim Speichern und Zurßckladen vom Sekundärspeicher ohne Wandlung auskommen. Mittels Speichervirtualisierung kÜnnen Daten auf dem Sekundärspeicher sogar direkt vom Programm angesprochen werden.

Bedeutsam ist dies fßr Containerformate mit einer allgemeinen Strukturdefinition. So wurde das Interchange File Format (IFF) fßr Amiga-Programme entworfen, und entsprechend diesem Motorola-68000-Prozessor wurden die Vier-Byte-Chunk-Längen im Motorola-Format big-endian abgelegt. Auf dem ebenfalls mit Motorola-Prozessoren arbeitenden Macintosh-Rechnern wurde dieses u. a. fßr das Audioformat AIFF ßbernommen.

Bei der Übernahme auf die Windows-Plattform mit Intel-Prozessoren wurden die Chunk-Längen umdefiniert auf das Vier-Byte Intel-Format little-endian und das neue allgemeine Containerformat als Resource Interchange File Format (RIFF) bezeichnet. Dieses RIFF-Dateiformat ist die Grundlage verbreiteter Dateiformate wie RIFF WAVE (*.wav-Dateien) für Audio und Audio Video Interleave (*.avi-Dateien) für Video.

Auch bei Dateiformaten ist es mÜglich, eine Definition zu entwickeln, die beide Byte-Reihenfolgen der Prozessorarchitekturen zulässt. So steht z. B. bei TIFF-Dateien (Tagged Image File Format) in den ersten zwei Bytes der Datei:

• II für Intel-Format (little-endian) oder
• MM für Motorola-Format (big-endian).

Nachfolgende Längen- und Offset-Werte in der Datei werden dann entsprechend kodiert.

Etymologie

Die Bezeichnungen gehen auf den satirischen Roman Gullivers Reisen von Jonathan Swift zurück, in dem die Bewohner des Landes Liliput in zwei verfeindeten Gruppen leben: Die einen schlagen ihre Frühstücks-Eier am dicken, „großen“, englisch „big“, Ende auf und werden deshalb als Big Ender bezeichnet, während die Little Ender die Eier am spitzen, „kleinen“, englisch „little“ Ende öffnen. Swift spielte damit auf die Abspaltung der englischen Kirche (Spitz-Ender) von der katholischen Kirche (Dick-Ender) an – in Zusammenhang mit der Byte-Reihenfolge wurde dies erstmals 1980 von Danny Cohen in dem Aprilscherz-Paper On Holy Wars and a Plea for Peace gebracht.cite-ref-13[13]

Weblinks

• cohen Danny Cohen: On Holy Wars and a Plea for Peace. IETF, IEN (Internet Experiment Note) 137, 1. April 1980 (englisch).
• White Paper: Endianness or Where is Byte 0? (PDF; 155 kB) 3bc.bertrand-blanc.com (englisch).

Einzelnachweise und Anmerkungen

cite-note-mil-std-188-100-11. ↑ MIL-STD-188-100, S. B-8, Abb. 3, 1972. oder Datei:MIL-STD-188-100 char struct for async comms 1972-11-15.svg
cite-note-22. ↑ Dies gilt vor allem für Maschinen, bei denen die Länge der Operanden im Maschinenbefehl codiert ist. Nicht in dieses Schema passen Maschinen wie die IBM 1401, bei der sogenannte „Wortmarken“ im Speicher die Ausdehnung der Speicheroperanden bestimmen. Solche Maschinen können – je nach Maschinenbefehl – ein aus (mehreren zusammenhängenden Speicherstellen bestehendes) Feld an seiner niedrigen oder seiner hohen Adresse ansprechen und zum anderen Ende hin abarbeiten; so adressiert beispielsweise der Addieren-Befehl der IBM 1401 die Operanden an der Einerstelle (bei dieser Maschine an der hohen Adresse) und arbeitet sich zur Wortmarke vor. Beim Dividieren-Befehl wird der Dividend an der höchstwertigen Stelle (der niedrigen Adresse) und der Divisor an der Einerstelle angesprochen. IBM 1410 Principles of Operation. (PDF; 22 MB) informatik.uni-stuttgart.de, S. 9; abgerufen am 3. November 2014.
cite-note-33. ↑ Dieser Zusammenhang zwischen Byte- und Bit-Reihenfolge wurde schon von Cohen (p. 3) hergestellt.
cite-note-44. ↑ Der Vergleich von Zeichenketten durch Maschineninstruktionen oder die C-Funktionen memcmp() und strcmp() startet auf jeder Maschine am Anfangsbuchstaben der Zeichenkette und wertet damit die Stellen niedriger Adresse als höherrangig, agiert also im Big-Endian-Stil. Man nennt diese Übertragung der Ordnung von den einzelnen Bytes auf mehrstellige Felder, wenn sie bei der ersten Stelle beginnt, die lexikographische Ordnung. (strncmp. In: cppreference.com. Abgerufen am 26. März 2015 (englisch). ) Die Erwähnung von Zeichenketten („Strings“) in der Literatur, z. B. Big and Little Endian C-style strings und Byte Ordering, im Kontext der Endianness beschränkt sich häufig auf die Übertragungsweise.
cite-note-55. ↑ msdn.microsoft.com
cite-note-66. ↑ Obwohl bspw. der C- oder C++-Compiler selbstverständlich „wissen muss“, für welchen Endianness-Typ er kompiliert, gibt es keine standardisierte #define-Konstante, die den Endianness-Typ abzufragen gestattet. ISO/IEC 14882:2014, auch bekannt als C++14. iso.org; abgerufen am 21. Mai 2016.
cite-note-77. ↑ Damit der potentiell sehr viele Maschinenzyklen umfassende Befehl den Hauptprozessor nicht monopolisiert, ist er unterbrechbar konzipiert und kann nach einem Hardwareinterrupt an der Stelle fortgesetzt werden, an der er unterbrochen worden ist. (Siehe ESA/390 principles of operation, chapter 7-44 General Instructions SA22-7201-08 ESA/390 Principles of Operation. In: boulder.ibm.com. Ehemals im Original (nicht mehr online verfügbar); abgerufen am 25. Juni 2014 (englisch).@1@2Vorlage:Toter Link/publibfp.boulder.ibm.com (Seite nicht mehr abrufbar. Suche in Webarchiven) )
cite-note-88. ↑ memcmp. In: cppreference.com. Abgerufen am 6. März 2014 (englisch).
cite-note-kueveler-schwoch-2007-99. ↑ Gerd Küveler, Dietrich Schwoch: Informatik für Ingenieure und Naturwissenschaftler: PC- und Mikrocomputertechnik, Rechnernetze. 5. Auflage. Band 2. Vieweg, reprint: Springer-Verlag, 2007, ISBN 978-3-8348-9191-4 (google.de).
cite-note-1010. ↑ AVR32 Architecture Document. (PDF; 5,1 MB) Atmel, November 2007
cite-note-1111. ↑ Jeff Scheel: Little endian and Linux on IBM Power Systems. Answers to your frequently asked questions. In: IBM Developer. 16. Juni 2016, abgerufen am 14. Juli 2019 (englisch).
cite-note-1212. ↑ Is iOS guaranteed to be little-endian? Abgerufen am 30. März 2024 (englisch).